/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package music.emotion.engine;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import music.emotion.Asset;
import music.emotion.engine.facts.ActionFacts;
import music.emotion.engine.facts.AgeFacts;
import music.emotion.engine.facts.Facts;
import music.emotion.engine.facts.GenreFacts;
import music.emotion.engine.facts.MelodyFacts;
import music.emotion.engine.facts.RhythmFacts;
import music.emotion.engine.rules.Rule;

/**
 *
 * @author Morian
 */
public final class Loading {

    public Loading() {
//        makeDefaultAgeFacts();
//        makeDefaultActionFacts();
//        makeDefaultGenreFacts();
//        makeDefaultMelodyFacts();
//        makeDefaultRhythmFacts();

        try {
            Asset.actionFactsList = readActionFactsList();
            Asset.ageFactsList = readAgeFactsList();
            Asset.genreFactsList = readGenreFactsList();
            Asset.melodyFactsList = readMelodyFactsList();
            Asset.rhythmFactsList = readRhythmFactsList();
//            makeRules();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Loading.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Loading.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Loading.class.getName()).log(Level.SEVERE, null, ex);
        }
        Asset.input = new ArrayList<Facts>();
        Asset.input.add(Asset.actionFactsList.get(5));
        Asset.input.add(Asset.ageFactsList.get(2));
    }

    public ArrayList<AgeFacts> readAgeFactsList() throws FileNotFoundException, IOException, ClassNotFoundException {
        ArrayList<AgeFacts> list = new ArrayList();
        //Create new FileInputStream object to read file
        FileInputStream fis = new FileInputStream("src\\music\\emotion\\engine\\file\\AgeFacts");
        //Create new ObjectInputStream object to read object from file
        ObjectInputStream obj = new ObjectInputStream(fis);
        try {
            while (fis.available() != -1) {
                //Read object from file
                AgeFacts acc = (AgeFacts) obj.readObject();
                list.add(acc);
            }
        } catch (EOFException ex) {
            //ex.printStackTrace();
        }
        return list;

    }

    public ArrayList<ActionFacts> readActionFactsList() throws FileNotFoundException, IOException, ClassNotFoundException {
        ArrayList<ActionFacts> list = new ArrayList();
        //Create new FileInputStream object to read file
        FileInputStream fis = new FileInputStream("src\\music\\emotion\\engine\\file\\ActionFacts");
        //Create new ObjectInputStream object to read object from file
        ObjectInputStream obj = new ObjectInputStream(fis);
        try {
            while (fis.available() != -1) {
                //Read object from file
                ActionFacts acc = (ActionFacts) obj.readObject();
                list.add(acc);
            }
        } catch (EOFException ex) {
            //ex.printStackTrace();
        }
        return list;
    }

    public ArrayList<GenreFacts> readGenreFactsList() throws FileNotFoundException, IOException, ClassNotFoundException {
        ArrayList<GenreFacts> list = new ArrayList();
        //Create new FileInputStream object to read file
        FileInputStream fis = new FileInputStream("src\\music\\emotion\\engine\\file\\GenreFacts");
        //Create new ObjectInputStream object to read object from file
        ObjectInputStream obj = new ObjectInputStream(fis);
        try {
            while (fis.available() != -1) {
                //Read object from file
                GenreFacts acc = (GenreFacts) obj.readObject();
                list.add(acc);
            }
        } catch (EOFException ex) {
            //ex.printStackTrace();
        }
        return list;
    }

    public ArrayList<MelodyFacts> readMelodyFactsList() throws IOException, ClassNotFoundException {
        ArrayList<MelodyFacts> list = new ArrayList();
        //Create new FileInputStream object to read file
        FileInputStream fis = new FileInputStream("src\\music\\emotion\\engine\\file\\MelodyFacts");
        //Create new ObjectInputStream object to read object from file
        ObjectInputStream obj = new ObjectInputStream(fis);
        try {
            while (fis.available() != -1) {
                //Read object from file
                MelodyFacts acc = (MelodyFacts) obj.readObject();
                list.add(acc);
            }
        } catch (EOFException ex) {
            //ex.printStackTrace();
        }
        return list;
    }

    public ArrayList<RhythmFacts> readRhythmFactsList() throws FileNotFoundException, IOException, ClassNotFoundException {
        ArrayList<RhythmFacts> list = new ArrayList();
        //Create new FileInputStream object to read file
        FileInputStream fis = new FileInputStream("src\\music\\emotion\\engine\\file\\RhythmFacts");
        //Create new ObjectInputStream object to read object from file
        ObjectInputStream obj = new ObjectInputStream(fis);
        try {
            while (fis.available() != -1) {
                //Read object from file
                RhythmFacts acc = (RhythmFacts) obj.readObject();
                list.add(acc);
            }
        } catch (EOFException ex) {
            //ex.printStackTrace();
        }
        return list;
    }

    public static void makeDefaultAgeFacts() {
        ArrayList<AgeFacts> list = new ArrayList();
        list.add(new AgeFacts("AF1", 0, 2, "Độ tuổi mới sinh"));
        list.add(new AgeFacts("AF2", 3, 6, "Trong độ tuổi học mẫu giáo, nhi đồng"));
        list.add(new AgeFacts("AF3", 7, 15, "Trong độ tuổi thiếu niên"));
        list.add(new AgeFacts("AF4", 16, 28, "Tuổi trường thành"));
        list.add(new AgeFacts("AF5", 29, 50, "Tuôi trung niên"));
        list.add(new AgeFacts("AF6", 51, 150, "Người cao tuổi"));
        try {
            //Create FileOutputStream to write file
            FileOutputStream fos = new FileOutputStream("src\\music\\emotion\\engine\\file\\AgeFacts");
            //Create ObjectOutputStream to write object
            ObjectOutputStream objOutputStream = new ObjectOutputStream(fos);
            //Write object to file
            for (Object obj : list) {
                objOutputStream.writeObject(obj);
                objOutputStream.reset();
            }
            objOutputStream.close();
        } catch (IOException e) {
            System.err.printf(e + "");
        }

    }

    public static void makeDefaultActionFacts() {
        ArrayList<ActionFacts> list = new ArrayList();
        list.add(new ActionFacts("AC1", "Vui"));
        list.add(new ActionFacts("AC2", "Buồn"));
        list.add(new ActionFacts("AC3", "Phấn khích"));
        list.add(new ActionFacts("AC4", "Rung động"));
        list.add(new ActionFacts("AC5", "Thất vọng"));
        list.add(new ActionFacts("AC6", "Êm đềm"));
        list.add(new ActionFacts("AC7", "Thư giãn"));
        list.add(new ActionFacts("AC8", "Đọc sách"));
        list.add(new ActionFacts("AC9", "Mưa"));
        list.add(new ActionFacts("AC10", "Thể thao"));
        list.add(new ActionFacts("AC11", "Tập trung"));
        list.add(new ActionFacts("AC12", "Cafe"));
        try {
            //Create FileOutputStream to write file
            FileOutputStream fos = new FileOutputStream("src\\music\\emotion\\engine\\file\\ActionFacts");
            //Create ObjectOutputStream to write object
            ObjectOutputStream objOutputStream = new ObjectOutputStream(fos);
            //Write object to file
            for (Object obj : list) {
                objOutputStream.writeObject(obj);
                objOutputStream.reset();
            }
            objOutputStream.close();
        } catch (IOException e) {
            System.err.printf(e + "");
        }
    }

    public static void makeDefaultGenreFacts() {
        ArrayList<GenreFacts> list = new ArrayList();
        list.add(new GenreFacts("GF1", "Nhạc thiếu nhi"));
        list.add(new GenreFacts("GF2", "Nhạc trữ tình"));
        list.add(new GenreFacts("GF3", "Nhạc cách mạng"));
        list.add(new GenreFacts("GF4", "Nhạc quê hương"));
        list.add(new GenreFacts("GF5", "Nhạc POP"));
        list.add(new GenreFacts("GF6", "Nhạc ROCK"));
        list.add(new GenreFacts("GF7", "Nhạc không lời"));
        try {
            //Create FileOutputStream to write file
            FileOutputStream fos = new FileOutputStream("src\\music\\emotion\\engine\\file\\GenreFacts");
            //Create ObjectOutputStream to write object
            ObjectOutputStream objOutputStream = new ObjectOutputStream(fos);
            //Write object to file
            for (Object obj : list) {
                objOutputStream.writeObject(obj);
                objOutputStream.reset();
            }
            objOutputStream.close();
        } catch (IOException e) {
            System.err.printf(e + "");
        }
    }

    public static void makeDefaultMelodyFacts() {
        ArrayList<MelodyFacts> list = new ArrayList();
        list.add(new MelodyFacts("MF1", 1, "Nhịp điệu du dương"));
        list.add(new MelodyFacts("MF2", 2, "Nhịp điệu sôi động"));
        list.add(new MelodyFacts("MF3", 3, "Nhịp điệu trầm lắng"));
        try {
            //Create FileOutputStream to write file
            FileOutputStream fos = new FileOutputStream("src\\music\\emotion\\engine\\file\\MelodyFacts");
            //Create ObjectOutputStream to write object
            ObjectOutputStream objOutputStream = new ObjectOutputStream(fos);
            //Write object to file
            for (Object obj : list) {
                objOutputStream.writeObject(obj);
                objOutputStream.reset();
            }
            objOutputStream.close();
        } catch (IOException e) {
            System.err.printf(e + "");
        }
    }

    public static void makeDefaultRhythmFacts() {
        ArrayList<RhythmFacts> list = new ArrayList();
        list.add(new RhythmFacts("RF1", 1, "Tiết tấu nhanh"));
        list.add(new RhythmFacts("RF2", 2, "Tiếu tấu chậm"));
        try {
            //Create FileOutputStream to write file
            FileOutputStream fos = new FileOutputStream("src\\music\\emotion\\engine\\file\\RhythmFacts");
            //Create ObjectOutputStream to write object
            ObjectOutputStream objOutputStream = new ObjectOutputStream(fos);
            //Write object to file
            for (Object obj : list) {
                objOutputStream.writeObject(obj);
                objOutputStream.reset();
            }
            objOutputStream.close();
        } catch (IOException e) {
            System.err.printf(e + "");
        }
    }

    public static void makeRules() {
        ArrayList<Rule> list = new ArrayList();
        // setRule
        ArrayList<Facts> gt = new ArrayList<Facts>();
        ArrayList<Facts> kl = new ArrayList<Facts>();
        // Theem luật ở đây 
        // ====================AF1==============================
        //AF1 => GF1 , MF2, RF1
        gt.add(Asset.ageFactsList.get(0));
        kl.add(Asset.genreFactsList.get(0));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
        //AF1 => GF7 , MF1
        gt.add(Asset.ageFactsList.get(0));
        kl.add(Asset.genreFactsList.get(6));
        kl.add(Asset.melodyFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
        //======================AF2=======================
        //AF2 => GF1 ^ MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(1));
        kl.add(Asset.genreFactsList.get(0));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
        // AF2 => GF4
        gt.add(Asset.ageFactsList.get(1));
        kl.add(Asset.genreFactsList.get(4));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
        //==========================AF3=====================

//	Khi vui, nghe các thể loại nhạc POP hoặc ROCK với giai điệu sôi động và tiết tấu nhanh
//	AF3 ^ AC1  GF5 ^ MF2 ^ RF1 
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(0));
        kl.add(Asset.genreFactsList.get(4));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC1  GF6 ^ MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(0));
        kl.add(Asset.genreFactsList.get(5));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi buồn, nghe các bài nhạc không lời, giai điệu du dương hoặc trầm lắng, tiết tấu chậm
//	AF3 ^ AC2  GF7 ^ MF1 ^ RF2
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(1));
        kl.add(Asset.genreFactsList.get(6));
        kl.add(Asset.melodyFactsList.get(0));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC2  GF7 ^ MF3 ^ RF2
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(1));
        kl.add(Asset.genreFactsList.get(6));
        kl.add(Asset.melodyFactsList.get(2));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi phấn khích nghe các bài ROCK với giai điệu sôi động, tiết tấu nhanh
//	AF3 ^ AC3  GF6 ^ MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(2));
        kl.add(Asset.genreFactsList.get(5));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi rung động, nghe các bài POP hoặc trữ tình  với giai điệu du dương với tiết tấu chậm
//	AF3 ^ AC4  GF5 ^ MF1 ^ RF2
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(3));
        kl.add(Asset.genreFactsList.get(4));
        kl.add(Asset.melodyFactsList.get(0));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC4  GF2 ^ MF1 ^ RF2
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(3));
        kl.add(Asset.genreFactsList.get(1));
        kl.add(Asset.melodyFactsList.get(0));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thất vọng, nghe các bài hát không lời
//	AF3 ^ AC5  GF7
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(4));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi  cảm thấy êm đềm thì nghe các bài hát của buồn và vui
//	AF3 ^ AC6  AC1 
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(5));
        kl.add(Asset.actionFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC6  AC2
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(5));
        kl.add(Asset.actionFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thư giãn thì nghe nhạc vui
//	AF3 ^ AC7  AC1
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(6));
        kl.add(Asset.actionFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi đọc sách, mưa thì nghe nhạc không lời
//	AF3 ^ AC8  GF7
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(7));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC9  GF7
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(8));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thể thao thì nghe nhạc sôi động, tiết tấu nhanh
//	AF3 ^ AC10  MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(9));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi tập trung thì nghe nhạc không lời
//	AF3 ^ AC11  GF7
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(10));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi café thì nghe các ca khúc POP, ROCK, không lời
//	AF3 ^ AC12  GF5
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(4));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC12  GF6
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(5));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF3 ^ AC12  GF7
        gt.add(Asset.ageFactsList.get(2));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//================================AF4 ==================================

//	Khi vui, nghe các thể loại nhạc POP hoặc ROCK với giai điệu sôi động và tiết tấu nhanh
//	AF4 ^ AC1  GF5 ^ MF2 ^ RF1 
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(0));
        kl.add(Asset.genreFactsList.get(4));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC1  GF6 ^ MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(0));
        kl.add(Asset.genreFactsList.get(5));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi buồn, nghe các bài nhạc không lời hoặc các bản POP chậm, trầm lắng
//	AF4 ^ AC2  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(1));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC2  GF5 ^ MF3 ^RF2
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(1));
        kl.add(Asset.genreFactsList.get(4));
        kl.add(Asset.melodyFactsList.get(2));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi phấn khích nghe các bài ROCK 
//	AF4 ^ AC3  GF6
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(2));
        kl.add(Asset.genreFactsList.get(5));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi rung động, nghe các bài POP hoặc trữ tình, không lời
//	AF4 ^ AC4  GF5
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(3));
        kl.add(Asset.genreFactsList.get(4));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC4  GF2
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(3));
        kl.add(Asset.genreFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC4  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(3));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thất vọng, nghe các bài hát không lời
//	AF4 ^ AC5  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(4));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi  cảm thấy êm đềm thì nghe các bài hát về quê hương đất nước
//	AF4 ^ AC6  GF4 
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(5));
        kl.add(Asset.genreFactsList.get(3));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thư giãn thì nghe nhạc với giai điệu du dương, chậm
//	AF4 ^ AC7  MF1 ^ RF2
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(6));
        kl.add(Asset.melodyFactsList.get(0));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi đọc sách, mưa thì nghe nhạc không lời
//	AF4 ^ AC8  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(7));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC9  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(8));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thể thao thì nghe nhạc sôi động, tiết tấu nhanh
//	AF4 ^ AC10  MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(9));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi tập trung thì nghe nhạc không lời
//	AF4 ^ AC11  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(10));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi café thì nghe các ca khúc POP, trữ tình, không lời
//	AF4 ^ AC12  GF5
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(4));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC12  GF2
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF4 ^ AC12  GF7
        gt.add(Asset.ageFactsList.get(3));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();

//===============================AF5==============================
//	Khi vui, nghe các thể loại nhạc cách mạng hoặc quê hương với giai điệu sôi động và tiết tấu nhanh
//	AF5 ^ AC1  GF3 ^ MF2 ^ RF1 
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(0));
        kl.add(Asset.genreFactsList.get(4));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF5 ^ AC1  GF4 ^ MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(0));
        kl.add(Asset.genreFactsList.get(3));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi buồn, nghe các bài nhạc không lời hoặc các bản POP chậm, trầm lắng
//	AF5 ^ AC2  GF7
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(1));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF5 ^ AC2  GF5 ^ MF3 ^RF2
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(1));
        kl.add(Asset.genreFactsList.get(4));
        kl.add(Asset.melodyFactsList.get(2));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi phấn khích nghe các bài ROCK 
//	AF5 ^ AC3  GF6
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(2));
        kl.add(Asset.genreFactsList.get(5));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi rung động, nghe các bài trữ tình
//	AF5 ^ AC4  GF2
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(3));
        kl.add(Asset.genreFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thất vọng, nghe các bài hát không lời
//	AF5 ^ AC5  GF7
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(4));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi  cảm thấy êm đềm thì nghe các bài hát về quê hương đất nước hoặc cách mạng chậm, du dương
//	AF5 ^ AC6  GF4 
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(5));
        kl.add(Asset.genreFactsList.get(3));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF5 ^ AC6  GF3 ^ MF1 ^ RF2
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(5));
        kl.add(Asset.genreFactsList.get(2));
        kl.add(Asset.melodyFactsList.get(0));
        kl.add(Asset.rhythmFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thư giãn thì nghe nhạc với giai điệu du dương, chậm
//	AF5 ^ AC7  MF1 ^ RF2
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(6));
        kl.add(Asset.genreFactsList.get(0));
        kl.add(Asset.melodyFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi đọc sách, mưa thì nghe nhạc không lời
//	AF5 ^ AC8  GF7
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(7));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF5 ^ AC9  GF7
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(8));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi thể thao thì nghe nhạc sôi động, tiết tấu nhanh
//	AF5 ^ AC10  MF2 ^ RF1
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(9));
        kl.add(Asset.melodyFactsList.get(1));
        kl.add(Asset.rhythmFactsList.get(0));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi tập trung thì nghe nhạc không lời
//	AF5 ^ AC11  GF7
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(10));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	Khi café thì nghe các ca khúc POP, trữ tình, không lời
//	AF5 ^ AC12  GF5
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(4));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF5 ^ AC12  GF2
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(1));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF5 ^ AC12  GF7
        gt.add(Asset.ageFactsList.get(4));
        gt.add(Asset.actionFactsList.get(11));
        kl.add(Asset.genreFactsList.get(6));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//==============================AF6==========================
//       Nhóm người cao tuổi nghe các ca khúc cách mạng, quê hương, trữ tình
//       AF6 GF 3
        gt.add(Asset.ageFactsList.get(5));
        kl.add(Asset.genreFactsList.get(2));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF6 GF 4
        gt.add(Asset.ageFactsList.get(5));
        kl.add(Asset.genreFactsList.get(3));
        list.add(new Rule(gt, kl));
        gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();
//	AF6 GF 2
        gt.add(Asset.ageFactsList.get(5));
        kl.add(Asset.genreFactsList.get(1));
        list.add(new Rule(gt, kl));
       gt = new ArrayList<Facts>();
        kl = new ArrayList<Facts>();

        try {
            //Create FileOutputStream to write file
            FileOutputStream fos = new FileOutputStream("src\\music\\emotion\\engine\\file\\Rules");
            //Create ObjectOutputStream to write object
            ObjectOutputStream objOutputStream = new ObjectOutputStream(fos);
            //Write object to file
            for (Object obj : list) {
                objOutputStream.writeObject(obj);
                objOutputStream.reset();
            }
            objOutputStream.close();
        } catch (IOException e) {
            System.err.printf(e + "");
        }
    }
}